package cn.lizemin.factory.version0;

import cn.lizemin.factory.version0.parser.*;

import java.io.File;
import java.util.HashMap;
import java.util.Objects;

/**
 * @author lzm
 * @version 1.0
 * @description: 简单工厂
 * @date 2022/4/15 11:06
 */
public class FileParserFactory {
    /**
     * 存放所有的解析器
     */
    private static final HashMap<String, FileParser> parsers;

    /**
     * 根据不同的文件类型，返回不同的解析器用于文件解析
     * @param fileType
     * @return
     *
     * 缺陷：
     *      如果解析器有很多种，比如还有java,sql,c,py等各种文件的解析器
     *      而且每种解析器的创建逻辑和初始化过程非常复杂，
     *      那么这个简单工厂类的内部逻辑将会无比复杂
     */
    public static FileParser getInstance(String fileType) {
        //参数校验
        if (Objects.isNull(fileType) || fileType.isEmpty()) {
            return null;
        }

        if ("md".equals(fileType)){
            MdParser mdParser = new MdParser();
            /**
             * 如果解析器的创建逻辑和初始化过程非常复杂，那么这个函数将会很长，
             * 导致可读性变差
             *
             * 因此，我们需要为每种解析器单独用个类来创建（封装），来提升可读性，
             * 让专门的工厂去创建专门的类
             */
            return mdParser;
        } else if ("ppt".equals(fileType)) {
            PptParser pptParser = new PptParser();
            return pptParser;
        } else if ("doc".equals(fileType)) {
            DocParser docParser = new DocParser();
            return docParser;
        } else if ("txt".equals(fileType)) {
            TxtParser TxtParser = new TxtParser();
            return TxtParser;
        } else {
            return null;
        }
    }


    /**
     * 方案二：
     * 进一步优化，如果每种解析器都是单例模式，还可以使用缓存实现单例模式，同时节省内存
     */
    static {
        parsers = new HashMap<>();
        parsers.put("md5", new MdParser());
        parsers.put("ppt", new PptParser());
        parsers.put("txt", new TxtParser());
        parsers.put("doc", new DocParser());
    }

    public static FileParser createParser(String fileType) {
        //参数校验
        if (Objects.isNull(fileType) || fileType.isEmpty()) {
            return null;
        }
        return parsers.get(fileType);
    }




}
